package com.guli.gulimall.seckill;

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 * 1.整合sentinel
 * 1）导入依赖 spring-cloud-starter-alibaba-sentinel
 * 2) 下载sentinel的控制台 -sentinel-dashboard
 * 3) 配置sentinel
 * spring.cloud.sentinel.transport.port=8719    --数据发送端口
 * spring.cloud.sentinel.transport.dashboard=localhost:8333    --控制台地址
 * <p>
 * 2.每一个微服务都导入信息审计模块 actuator并配置暴露 management.endpoints.web.exposure.include=*
 * 3.自定义sentinel返回数据，实现 BlockExceptionHandler
 * 4.使用Sentinel 来保护feign(熔断)
 * 4.1）引入依赖 spring-cloud-starter-openfeign
 * 4.2)开启feign配置， feign.sentinel.enabled=true
 * 4.3)调用方手动指定远程服务的降级策略，远程服务被降级处理，出发熔断回调
 * 4.4）超大流量时，必须牺牲一些远程服务。在服务的提供方（远程服务）来指定降级策略。
 * 5.自定义受保护的资源
 * 5.1) 代码方式
 * try (Entry entry = SphU.entry("seckillSkus")) {//保护资源} catch(BlockException ex){//异常处理}
 * 5.2） 基于注解方式
 *
 * @SentinelResource(value = "getCurrentSeckillSkusResource",blockHandler = "blockHandler")
 * 无论是1.2方式，一定要配置被限流以后的默认返回
 * url请求可以设置统一的返回 implements BlockExceptionHandler
 */
@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
@EnableRedisHttpSession //开启spring session redis存储功能
@EnableRabbit //需要监听才开启
public class GulimallSeckillApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallSeckillApplication.class, args);
    }

}
